home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / vir_real / multi102.taz / multi102 / multiverse-1.0 / extensions / ext_mine.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-01  |  4.1 KB  |  149 lines

  1.  
  2. /**
  3.  
  4. #     #                                 #     #
  5. ##   ##  #    #  #        #####     #   #     #  ######  #####    ####   ######
  6. # # # #  #    #  #          #       #   #     #  #       #    #  #       #
  7. #  #  #  #    #  #          #       #   #     #  #####   #    #   ####   #####
  8. #     #  #    #  #          #       #    #   #   #       #####        #  #
  9. #     #  #    #  #          #       #     # #    #       #   #   #    #  #
  10. #     #   ####   ######     #       #      #     ######  #    #   ####   ######
  11.  
  12.  #####
  13. #     #   #   #   ####    #####  ######  #    #
  14. #          # #   #          #    #       ##  ##
  15.  #####      #     ####      #    #####   # ## #
  16.       #     #         #     #    #       #    #
  17. #     #     #    #    #     #    #       #    #
  18.  #####      #     ####      #    ######  #    #
  19.  
  20.     Copyright: Robert Grant, 1993
  21.  
  22. **/
  23.  
  24. #define _XOPEN_SOURCE
  25. #define _ALL_SOURCE
  26.  
  27. /* includes */
  28.  
  29. #include <stdio.h>
  30. #include <math.h>
  31. #include <stdlib.h>
  32.  
  33. #include <graphics.h>
  34. #include <messages.h>
  35. #include <eventHandler.h>
  36. #include <clientManager.h>
  37. #include <objectManager.h>
  38.  
  39. #include <ext_mine.h>
  40.  
  41. /* Globals */
  42.  
  43. /* Macros */
  44.  
  45. int initMine(object_t *theMine, mineExt_t *mineData, init_t *event) {
  46.  
  47.     serverEventMsg_t ev;
  48.     createObject_t object;
  49.     changePanel_t panel;
  50.     object_t *parent;
  51.     parent = event->parent;
  52.     if (mineData->fired)
  53.         return 0;
  54.     mineData->fired = 100;
  55.     (void)memcpy(&theMine->coords,
  56.                     &parent->coords, sizeof(viewpoint));
  57.     theMine->coords.rot.z = 0;
  58.     theMine->coords.loc.y -= 7.5;
  59.     strcpy(object.name, theMine->name);
  60.     strcpy(object.type, theMine->type);
  61.     memcpy(&object.coords, &theMine->coords, sizeof(viewpoint));
  62.     object.class = MANAGED;
  63.     composeServerEventMessage(&ev, CREATE, OBJECT, NULL, &object);
  64.     broadcast(SERVEREVENT, sizeof(ev), &ev);
  65.     panel.type = PANEL_VALUE;
  66.     sprintf(panel.name, "biwing:mine:%s", strchr(theMine->name, '-') + 1);
  67.     panel.value = 1;
  68.     composeServerEventMessage(&ev, CHANGE, CHG_PANEL, "biwing", &panel);
  69.     sendMessage(theMine->socket, SERVEREVENT, sizeof(serverEventMsg_t), &ev);
  70.     theMine->collider = createCollider();
  71.     if (!theMine->collider) {
  72.         fprintf(stderr, "Can't get space for collision detection!\n");
  73.         return 0;
  74.         }
  75.     theMine->collider->obj = theMine;
  76.     theMine->collider->type = OBJ_DYNAMIC;
  77.     theMine->collider->boundType = BOX;
  78.     theMine->collider->box[0].x = -2.5;
  79.     theMine->collider->box[0].y = -2.5;
  80.     theMine->collider->box[0].z = -2.5;
  81.     theMine->collider->box[1].x = 2.5;
  82.     theMine->collider->box[1].y = 2.5;
  83.     theMine->collider->box[1].z = 2.5;
  84.     addCollider(theMine->collider);
  85.     return 1;
  86.     }
  87.  
  88. void moveMine(object_t *theMine, mineExt_t *mineData, move_t *event) {
  89.     
  90.     serverEventMsg_t ev;
  91.     changePanel_t panel;
  92.  
  93.     if (mineData->fired) {
  94.         mineData->fired--;
  95.         if (mineData->fired == 0) {
  96.             ev.type = DELETE;
  97.             strcpy(ev.event.moveEvent.name, theMine->name);
  98.             broadcast(SERVEREVENT, sizeof(serverEventMsg_t), &ev);
  99.             panel.type = PANEL_VALUE;
  100.             sprintf(panel.name, "biwing:mine:%s", strchr(theMine->name, '-') + 1);
  101.             panel.value = 0;
  102.             composeServerEventMessage(&ev, CHANGE, CHG_PANEL, "biwing", &panel);
  103.             sendMessage(theMine->socket, SERVEREVENT, sizeof(serverEventMsg_t), &ev);
  104.             removeCollider(theMine->collider);
  105.             free(theMine->collider);
  106.             theMine->collider = NULL;
  107.             return;
  108.             }
  109.         }
  110.     }
  111.  
  112. int checkMineCollision(object_t *theMine, mineExt_t *mineData,
  113.                             collideEvent_t *event) {
  114.  
  115.     object_t *theCollider;
  116.     termEvent_t term;
  117.     theCollider = event->obj;
  118.  
  119.     if (theMine->parent == theCollider)
  120.         return 0;
  121.     if (theMine->parent == theCollider->parent)
  122.         return 0;
  123.     mineData->fired = 1;
  124.     term.type = TERM_NOTIFY_EVENT;
  125.     sendEventByRef(theMine->parent, &term);
  126.     return 1;
  127.     }
  128.  
  129.  
  130. int addMineExtensions(object_t *theObject) {
  131.  
  132.     mineExt_t *temp = NULL;
  133.     int i;
  134.     if ((temp = (mineExt_t *)malloc(sizeof(mineExt_t))) == NULL) {
  135.         fprintf(stderr, "Can't allocate space for mine extension!\n");
  136.         return 0;
  137.         }
  138.     temp->fired = 0;
  139.     addEventHandler(theObject, MOVE_EVENT, temp, moveMine);
  140.     addEventHandler(theObject, INIT_EVENT, temp, initMine);
  141.     addEventHandler(theObject, COLLISION_NOTIFY_EVENT, temp, checkMineCollision);
  142.     }
  143.  
  144. int installMineExtensions() {
  145.  
  146.     installEventHandlerCreator("mine", addMineExtensions);
  147.     }
  148.  
  149.